using AutoMapper;
using BaseData.ReadApi.Appcontext.Command.Sheep_Records;
using MediatR;
using SmartTracking.Domain.HQX;
using SmartTracking.ErrorCode;
using SmartTracking.Infrastructure.Interfaces;

namespace BaseData.ReadApi.Appcontext.CommandHandler.Sheep_Records
{
    /// <summary>
    /// 羊只档案查询命令处理器
    /// </summary>
    public class GetSheepRecordByIdCommandHandler : IRequestHandler<GetSheepRecordByIdCommand, ApiResult<SheepRecords>>
    {
        private readonly IBaseRepository<SheepRecords> _sheepRecordRepository;
        private readonly IMapper _mapper;
        private readonly ILogger<GetSheepRecordByIdCommandHandler> _logger;

        public GetSheepRecordByIdCommandHandler(
            IBaseRepository<SheepRecords> sheepRecordRepository,
            IMapper mapper,
            ILogger<GetSheepRecordByIdCommandHandler> logger)
        {
            _sheepRecordRepository = sheepRecordRepository;
            _mapper = mapper;
            _logger = logger;
        }

        /// <summary>
        /// 处理羊只档案查询命令
        /// </summary>
        /// <param name="request">羊只档案查询命令</param>
        /// <param name="cancellationToken">取消令牌</param>
        /// <returns>查询结果</returns>
        public async Task<ApiResult<SheepRecords>> Handle(GetSheepRecordByIdCommand request, CancellationToken cancellationToken)
        {
            try
            {
                // 验证请求参数
                if (request == null)
                {
                    _logger.LogWarning("羊只档案查询请求参数为空");
                    return new ApiResult<SheepRecords>
                    {
                        Code = ApiEnum.查询失败,
                        Message = "请求参数不能为空",
                        data = default
                    };
                }

                // 验证数据
                if (!request.Validate(out string errorMessage))
                {
                    _logger.LogWarning($"羊只档案查询数据验证失败: {errorMessage}");
                    return new ApiResult<SheepRecords>
                    {
                        Code = ApiEnum.查询失败,
                        Message = errorMessage,
                        data = default
                    };
                }

                // 根据ID查询羊只档案
                var sheepRecord = await _sheepRecordRepository.GetByIdAsync(request.SheepId);
                
                if (sheepRecord == null)
                {
                    _logger.LogWarning($"未找到ID为 {request.SheepId} 的羊只档案");
                    return new ApiResult<SheepRecords>
                    {
                        Code = ApiEnum.查询失败,
                        Message = "未找到指定的羊只档案",
                        data = default
                    };
                }

                // 检查是否已被删除
                if (sheepRecord.IsDeleted)
                {
                    _logger.LogWarning($"ID为 {request.SheepId} 的羊只档案已被删除");
                    return new ApiResult<SheepRecords>
                    {
                        Code = ApiEnum.查询失败,
                        Message = "羊只档案已被删除",
                        data = default
                    };
                }

                _logger.LogInformation($"成功查询羊只档案，ID: {request.SheepId}");
                return new ApiResult<SheepRecords>
                {
                    Code = ApiEnum.查询成功,
                    Message = "羊只档案查询成功",
                    data = sheepRecord
                };
            }
            catch (ArgumentException ex)
            {
                _logger.LogWarning($"参数验证异常: {ex.Message}");
                return new ApiResult<SheepRecords>
                {
                    Code = ApiEnum.查询失败,
                    Message = ex.Message,
                    data = default
                };
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"查询羊只档案时发生系统异常: {ex.Message}");
                return new ApiResult<SheepRecords>
                {
                    Code = ApiEnum.查询失败,
                    Message = "系统异常，请联系管理员",
                    data = default
                };
            }
        }
    }
}